#!/bin/sh
#
# Copyright (C) 2000-2025 Kern Sibbald
# License: BSD 2-Clause; see file LICENSE-FOSS
#
# Run a simple backup of the Bacula build directory using the compressed option
#   then backup four times, each with incremental then 
#   do a bscan and restore.
#   It should require at least 4 different bsrs.
#
TestName="bscan-tape"
JobName=bscantape
. scripts/functions

require_tape_drive

copy_tape_confs

echo "${cwd}/build" >tmp/file-list

cp ${cwd}/bin/bacula-sd.conf tmp/1
sed "s%# Maximum File Size%  Maximum File Size%" tmp/1 >${cwd}/bin/bacula-sd.conf

change_jobname NightlySave $JobName
start_test

cat <<END_OF_DATA >tmp/bconcmds
@$out /dev/null
estimate job=$JobName listing
estimate job=$JobName listing
messages
@$out tmp/log1.out
setdebug level=2 storage=tape
label storage=tape volume=TestVolume001 slot=0 pool=Default
run job=$JobName level=Full yes 
wait
run job=$JobName level=Full yes
wait
messages
quit
END_OF_DATA

run_bacula
check_for_zombie_jobs storage=tape

# make some files for the incremental to pick up
touch ${cwd}/build/src/dird/*.c ${cwd}/build/src/dird/*.o
touch ${cwd}/build/src/lib/*.c ${cwd}/build/src/lib/*.o
   
#
# run a second job
#
cat <<END_OF_DATA >tmp/bconcmds
@$out /dev/null
messages
@$out tmp/log1.out
run job=$JobName level=Incremental yes
wait
messages
quit
END_OF_DATA

run_bconsole
scripts/check_for_zombie_jobs storage=tape

touch ${cwd}/build/src/dird/*.c
touch ${cwd}/build/src/lib/*.c ${cwd}/build/src/lib/*.o
#
# run a third job
#

run_bconsole
scripts/check_for_zombie_jobs storage=tape

# make some files for the incremental to pick up
touch ${cwd}/build/src/lib/*.c ${cwd}/build/src/lib/*.o
#echo "abc" > ${cwd}/build/src/lib/dummy
#
# run a fourth job
#

run_bconsole
scripts/check_for_zombie_jobs storage=tape

stop_bacula

#
# now drop and recreate the database
#
cd bin
./drop_bacula_tables >/dev/null 2>&1
./make_bacula_tables >/dev/null 2>&1
./grant_bacula_privileges 2>&1 >/dev/null
cd ..

echo "volume=TestVolume001" >tmp/bscan.bsr

bscan_libdbi

# If the database has a password pass it to bscan
if test "x${db_password}" = "x"; then
  PASSWD=
else
  PASSWD="-P ${db_password}"
fi

if test "$debug" -eq 1 ; then
  $bin/bscan -w working $BSCANLIBDBI -u ${db_user} -n ${db_name} $PASSWD -m -s -v -b tmp/bscan.bsr -c bin/bacula-sd.conf tape                
else
  $bin/bscan -w working $BSCANLIBDBI -u ${db_user} -n ${db_name} $PASSWD -m -s -v -b tmp/bscan.bsr -c bin/bacula-sd.conf tape >/dev/null 2>&1
fi

echo $BSCANLIBDBI

cat <<END_OF_DATA >tmp/bconcmds
@$out /dev/null
messages
@$out tmp/log2.out
@# 
@# now do a restore
@#
restore where=${cwd}/tmp/bacula-restores select all storage=tape done
yes
wait
messages
quit
END_OF_DATA

run_bacula
check_for_zombie_jobs storage=tape
stop_bacula
rm -f  ${cwd}/build/src/lib/dummy

check_two_logs
check_restore_diff
end_test
